package songZhao.MinaDemo.IObuffer;

import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;

/**
 * 主要说明几个iobuffer的API的作用,
 * 这里很多方法,其实是直接调用了Buffer java.nio.Buffer中的方法.
 * 比如 free reset mark clear等.
 * 三个概念
 * 		首先明确一个事情,buffer中的数据,并不是正好等于容量capacity的,正常情况是
 * 		总是用不了.
 * 
 * 		capacity:	 buffer初始化的容量,可以自动扩展.
 * 		limit:		 指向数据的尾部,标志着数据的结束,刚创建时,limit=capacity
 * 		position:	指针的位置.当前操作的位置,位于下一个要读取的数据的开头,或者
 * 					flip之后,读取到数据尾部时,position=limit
 */


import org.apache.mina.core.buffer.IoBuffer;

public class IObufferDemo {
	
	public static void bufferInfo(IoBuffer buffer) {
		System.out.println("===>Buffer Info<===");
		System.out.println("capacity:"+buffer.capacity());
		System.out.println("limit:"+buffer.limit());
		System.out.println("position:"+buffer.position());
		System.out.println();
	}
	
	public static void main(String[] args) throws CharacterCodingException {
		//分配1024字节的大小
	   IoBuffer buffer = IoBuffer.allocate(1024, false);
	   //自动扩容
	   buffer.setAutoExpand(true);
	   System.out.println("create");
	   /**
	    * 此时,buffer刚创建,capacity=limit
	    */
	   bufferInfo(buffer);
	   
	   
	   /**
	    * 获取UTF-8字符集的的编码和解码器.
	    * 用来存放和读取字符串.
	    */
	   Charset charset = Charset.forName("UTF-8");
	   CharsetEncoder encoder = charset.newEncoder();
	   CharsetDecoder decoder = charset.newDecoder();
	   //放入数据,注意放入字符串时,需要用到encoder
	   System.out.println("put data");
	   buffer.put((byte) 127);
	   buffer.putString("测试下中文的效果.", encoder);
	   bufferInfo(buffer);
	   
	   /*准备开始读取指针回零,limit调整到数据的实际长度的位置.
	    * 并且将position的值设为0.读取数据的预备动作.
	    */
	   System.out.println("flip");
	   buffer.flip();
	   bufferInfo(buffer);
	   
	   //读取数据
	   System.out.println("get data");
	   System.out.println("byte:"+buffer.get());
	   System.err.println("mark postion:"+buffer.position());
	   buffer.mark();		//标记一个位置,可以使用reset方法,将position回退至此处.
	   bufferInfo(buffer);
	   System.out.println("data:  "+buffer.getString(decoder));
	   bufferInfo(buffer);
	   
	   /**
	    * reset方法,将position回退至上一次mark的位置,并且不会改变或者清楚mark的值.
	    */
	   System.out.println("reset");
	   buffer.reset();
	   bufferInfo(buffer);
	   
	   /*clear
	    * 这个是准备再次进行写入. 讲position limit capacity重新重置到
	    * buffer刚创建的状态,不过数据并不会用新的内容进行覆盖.
	    */
	   System.out.println("clear");
	   buffer.clear();
	   bufferInfo(buffer);
	   
	   /**
	    * 这个是声明此buffer不再进行使用,可以提高性能.
	    * 如果调用了free之后接着又读取数据,数据也是可读的.
	    */
	   System.out.println("free");
	   buffer.free();
	   bufferInfo(buffer);
	   
	}
	
}
